package com.ldu.houserent.controller.backend;

import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ldu.houserent.common.base.BaseController;
import com.ldu.houserent.common.constant.Constant;
import com.ldu.houserent.common.dto.JsonResult;
import com.ldu.houserent.common.enums.HouseStatusEnum;
import com.ldu.houserent.common.util.PageUtil;
import com.ldu.houserent.entity.House;
import com.ldu.houserent.service.HouseService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpSession;
import java.util.Date;
import java.util.List;
import java.util.Objects;

/**
 * 房屋管理的控制器
 */
@Controller("backendHouseController")
@RequestMapping("/admin/house")     //房屋管理页面的地址
public class HouseController extends BaseController {

    @Autowired
    private HouseService houseService;

    /*
        进入房屋管理页面
     */
    @RequestMapping("")             //此处""内的内容是拼接在/admin/house之后的内容
    public String houseList(@RequestParam(value = "page",defaultValue = "1")Long pageNumber, @RequestParam(value = "size",defaultValue = "6")Long pageSize, Model model){
        //封装page
        Page page= PageUtil.initMpPage(pageNumber,pageSize);
        //进行查询
        House condition = new House();
        /*
            判断当前登录的用户。如果是管理员，则可以查询所有房屋；如果不是管理员，则只能查询自己上传的房屋
                由于在很多地方都需要这样的判断，因此在BaseController中写了一个公共的方法
         */
        if (!loginUserIsAdmin()){       //如果不是管理员
            condition.setUserId(getLoginUserId());      //设置用户id为当前登录的id
        }
        Page<House> housePage=houseService.findAll(page,condition);     //condition是查询条件
        //model存储数据返回前端
        model.addAttribute("pageInfo",housePage);
        model.addAttribute("pagePrefix","/admin/house?");
        model.addAttribute("isAdmin",loginUserIsAdmin());
        model.addAttribute("tab","house-list");         //鼠标点击后，改变页面中的字体颜色样式
        return "admin/house-list";      //指向jsp页面
    }

    /*
        进入房屋上传页面
     */
    @RequestMapping("/publish")             //此处""内的内容是拼接在/admin/house之后的内容
    public String publish(@RequestParam(value = "id",required = false)Long id,Model model){     //用model将当前数据传给前端
        House house=new House();
        //房屋信息编辑界面
        if (id!=null){      //说明这是在执行修改操作，即进入编辑页面；如id=null，则执行新增操作
            house=houseService.get(id);
            if (house==null){
                return renderNotFound();        //转向404页面
            }
            //如果没有管理员权限（即不是管理员），但是要编辑别人的房屋信息（房屋所属的id和当前登录的id做比较），则跳转到403页面
            if (!loginUserIsAdmin() && !Objects.equals(house.getUserId(),getLoginUserId())){
                return renderNotAllowAccess();
            }
        }
        model.addAttribute("house",house);
        return "admin/house-publish";      //指向jsp页面
    }

    /*
        上传房屋提交页面    插入功能的实现
     */
    @RequestMapping("/publish/submit")
    @ResponseBody
    public JsonResult publishSubmit(House house, @RequestParam("key")String key, HttpSession session){
        try {
            if (house.getId()==null) {      //id为空，说明当前是新增状态
                house.setCreateTime(new Date());
                house.setUserId(getLoginUserId());
            }else {                         //id不为空，说明当前是修改状态
                House queryHouse=houseService.get(house.getId());
                if (queryHouse==null){
                    return JsonResult.error("上传失败，没有找到该房屋");
                }
                //如果没有管理员权限（即不是管理员），但是要编辑别人的房屋信息（房屋所属的id和当前登录的id做比较）
                if (!loginUserIsAdmin() && !Objects.equals(queryHouse.getUserId(),getLoginUserId())){
                    return JsonResult.error("上传失败，您没有权限修改该房屋信息");
                }
            }
            house.setStatus(HouseStatusEnum.NOT_CHECK.getValue());      //默认是待审核状态
            //从session中获取轮播图
            String sessionKey = Constant.SESSION_IMG_PREFIX + key;
            List<String> imgList = (List<String>) session.getAttribute(sessionKey);
            if (imgList!=null && imgList.size()>0){     //imgList不为空且至少有一条数据
                //把轮播图转成json格式存储，存到数据库中
                house.setSlideUrl(JSON.toJSONString(imgList));
                //把轮播图的第一个图作为缩略图
                house.setThumbnailUrl(imgList.get(0));
            }
            houseService.insertOrUpdate(house);                         //保存
        }catch (Exception e){
            return JsonResult.error("上传失败，请填写完整信息后再提交");
        }
        return JsonResult.success("上传成功",house.getId());      //指向jsp页面
    }

    /*
        下架房屋
     */
    @RequestMapping("/down")
    @ResponseBody
    public JsonResult downHouse(@RequestParam("id")Long id){
        try {
            House house=houseService.get(id);   //根据id获取到房屋
            if (house==null){
                return JsonResult.error("操作失败，没有找到该房屋");
            }
            //如果没有管理员权限（即不是管理员），但是要下架别人的房屋信息（房屋所属的id和当前登录的id做比较）
            if (!loginUserIsAdmin() && !Objects.equals(house.getUserId(),getLoginUserId())){
                return JsonResult.error("操作失败，您没有权限下架该房屋");
            }
            //如果房屋正在租住中
            if (Objects.equals(house.getStatus(),HouseStatusEnum.HAS_RENT.getValue())){
                return JsonResult.error("操作失败，房屋正在租住中，您暂时无法下架该房屋");
            }
            house.setStatus(HouseStatusEnum.HAS_DOWN.getValue());       //下架房屋
            houseService.update(house);                                 //更新房屋信息
        }catch (Exception e){
            return JsonResult.error("下架房屋失败");
        }
        return JsonResult.success("下架房屋成功");
    }

    /*
        上架房屋
     */
    @RequestMapping("/up")
    @ResponseBody
    public JsonResult upHouse(@RequestParam("id")Long id){
        try {
            House house=houseService.get(id);   //根据id获取到房屋
            if (house==null){
                return JsonResult.error("操作失败，没有找到该房屋");
            }
            //如果没有管理员权限（即不是管理员），但是要上架别人的房屋信息（房屋所属的id和当前登录的id做比较）
            if (!loginUserIsAdmin() && !Objects.equals(house.getUserId(),getLoginUserId())){
                return JsonResult.error("操作失败，您没有权限上架该房屋");
            }
            //如果房屋正在租住中
            if (Objects.equals(house.getStatus(),HouseStatusEnum.HAS_RENT.getValue())){
                return JsonResult.error("操作失败，房屋正在租住中，您暂时无法上架该房屋");
            }
            house.setStatus(HouseStatusEnum.NOT_RENT.getValue());       //上架房屋，设置成未租出状态
            houseService.update(house);                                 //更新房屋信息
        }catch (Exception e){
            return JsonResult.error("上架房屋失败");
        }
        return JsonResult.success("上架房屋成功");
    }

    /*
        房屋审核通过
     */
    @RequestMapping("/checkPass")
    @ResponseBody
    public JsonResult checkPassHouse(@RequestParam("id")Long id){
        try {
            House house=houseService.get(id);   //根据id获取到房屋
            if (house==null){
                return JsonResult.error("操作失败，没有找到该房屋");
            }
            //只有管理员有权限审核房屋
            if (!loginUserIsAdmin()){
                return JsonResult.error("操作失败，您没有权限审核该房屋");
            }
            //如果房屋不是待审核状态，都不能审核
            if (!Objects.equals(house.getStatus(),HouseStatusEnum.NOT_CHECK.getValue())){
                return JsonResult.error("操作失败，房屋非待审核状态，您暂时无法审核该房屋");
            }
            house.setStatus(HouseStatusEnum.NOT_RENT.getValue());       //审核通过，设置成未租出状态
            houseService.update(house);                                 //更新房屋信息
        }catch (Exception e){
            return JsonResult.error("审核房屋失败");
        }
        return JsonResult.success("审核房屋成功");
    }

    /*
        房屋审核驳回
     */
    @RequestMapping("/checkReject")
    @ResponseBody
    public JsonResult checkRejectHouse(@RequestParam("id")Long id){
        try {
            House house=houseService.get(id);   //根据id获取到房屋
            if (house==null){
                return JsonResult.error("操作失败，没有找到该房屋");
            }
            //只有管理员有权限审核房屋
            if (!loginUserIsAdmin()){
                return JsonResult.error("操作失败，您没有权限审核该房屋");
            }
            //如果房屋不是待审核状态，都不能审核
            if (!Objects.equals(house.getStatus(),HouseStatusEnum.NOT_CHECK.getValue())){
                return JsonResult.error("操作失败，房屋非待审核状态，您暂时无法审核该房屋");
            }
            house.setStatus(HouseStatusEnum.CHECK_REJECT.getValue());       //审核不通过，设置成审核不通过状态
            houseService.update(house);                                 //更新房屋信息
        }catch (Exception e){
            return JsonResult.error("审核房屋失败");
        }
        return JsonResult.success("审核房屋成功");
    }

    /*
        删除房屋
     */
    @RequestMapping("/delete")
    @ResponseBody
    public JsonResult deleteHouse(@RequestParam("id")Long id){
        try {
            House house=houseService.get(id);   //根据id获取到房屋
            if (house==null){
                return JsonResult.error("操作失败，没有找到该房屋");
            }
            //如果没有管理员权限（即不是管理员），但是要删除别人的房屋信息（房屋所属的id和当前登录的id做比较），则无法操作
            if (!loginUserIsAdmin() && !Objects.equals(house.getUserId(),getLoginUserId())){
                return JsonResult.error("操作失败，您没有权限删除该房屋");
            }
            //如果房屋是已租住状态，则不可以删除
            if (Objects.equals(house.getStatus(),HouseStatusEnum.HAS_RENT.getValue())){
                return JsonResult.error("操作失败，房屋正在租住中，您暂时无法删除该房屋");
            }
            houseService.delete(id);     //删除房屋信息
        }catch (Exception e){
            return JsonResult.error("删除房屋失败");
        }
        return JsonResult.success("删除房屋成功");
    }


}//HouseController
